home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / vidhrdw / exctsccr.c < prev    next >
C/C++ Source or Header  |  2000-04-04  |  6KB  |  253 lines

  1. /***************************************************************************
  2.  
  3.   vidhrdw.c
  4.  
  5.   Functions to emulate the video hardware of the machine.
  6.  
  7. ***************************************************************************/
  8.  
  9. #include "driver.h"
  10. #include "vidhrdw/generic.h"
  11.  
  12. static int gfx_bank;
  13.  
  14. WRITE_HANDLER( exctsccr_gfx_bank_w ) {
  15.     gfx_bank = data & 1;
  16. }
  17.  
  18. void *exctsccr_fm_timer;
  19.  
  20. static void exctsccr_fm_callback( int param ) {
  21.     cpu_cause_interrupt( 1, 0xff );
  22. }
  23.  
  24. int exctsccr_vh_start( void ) {
  25.     exctsccr_fm_timer = timer_pulse( TIME_IN_HZ( 75.0 ), 0, exctsccr_fm_callback ); /* updates fm */
  26.  
  27.     return generic_vh_start();
  28. }
  29.  
  30. void exctsccr_vh_stop( void ) {
  31.     if ( exctsccr_fm_timer ) {
  32.         timer_remove( exctsccr_fm_timer );
  33.         exctsccr_fm_timer = 0;
  34.     }
  35.  
  36.     generic_vh_stop();
  37. }
  38.  
  39. /***************************************************************************
  40.  
  41.   Convert the color PROMs into a more useable format.
  42.  
  43. ***************************************************************************/
  44. void exctsccr_vh_convert_color_prom(unsigned char *palette, unsigned short *colortable,const unsigned char *color_prom)
  45. {
  46.     int i,idx;
  47.     #define TOTAL_COLORS(gfxn) (Machine->gfx[gfxn]->total_colors * Machine->gfx[gfxn]->color_granularity)
  48.     #define COLOR(gfxn,offs) (colortable[Machine->drv->gfxdecodeinfo[gfxn].color_codes_start + offs])
  49.  
  50.     for (i = 0;i < Machine->drv->total_colors;i++)
  51.     {
  52.         int bit0,bit1,bit2;
  53.  
  54.         bit0 = (color_prom[i] >> 0) & 0x01;
  55.         bit1 = (color_prom[i] >> 1) & 0x01;
  56.         bit2 = (color_prom[i] >> 2) & 0x01;
  57.         palette[3*i] = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
  58.         bit0 = (color_prom[i] >> 3) & 0x01;
  59.         bit1 = (color_prom[i] >> 4) & 0x01;
  60.         bit2 = (color_prom[i] >> 5) & 0x01;
  61.         palette[3*i + 1] = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
  62.         bit0 = 0;
  63.         bit1 = (color_prom[i] >> 6) & 0x01;
  64.         bit2 = (color_prom[i] >> 7) & 0x01;
  65.         palette[3*i + 2] = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
  66.     }
  67.  
  68.     color_prom += Machine->drv->total_colors;
  69.  
  70.     /* characters */
  71.     idx = 0;
  72.     for (i = 0;i < 32;i++)
  73.     {
  74.         COLOR(0,idx++) = color_prom[256+0+(i*4)];
  75.         COLOR(0,idx++) = color_prom[256+1+(i*4)];
  76.         COLOR(0,idx++) = color_prom[256+2+(i*4)];
  77.         COLOR(0,idx++) = color_prom[256+3+(i*4)];
  78.         COLOR(0,idx++) = color_prom[256+128+0+(i*4)];
  79.         COLOR(0,idx++) = color_prom[256+128+1+(i*4)];
  80.         COLOR(0,idx++) = color_prom[256+128+2+(i*4)];
  81.         COLOR(0,idx++) = color_prom[256+128+3+(i*4)];
  82.     }
  83.  
  84.     /* sprites */
  85.  
  86.     idx=0;
  87.  
  88.     for (i = 0;i < 15*16;i++)
  89.     {
  90.         if ( (i%16) < 8 )
  91.         {
  92.             COLOR(2,idx) = color_prom[i]+16;
  93.             idx++;
  94.         }
  95.     }
  96.     for (i = 15*16;i < 16*16;i++)
  97.     {
  98.         if ( (i%16) > 7 )
  99.         {
  100.             COLOR(2,idx) = color_prom[i]+16;
  101.             idx++;
  102.         }
  103.     }
  104.     for (i = 16;i < 32;i++)
  105.     {
  106.         COLOR(2,idx++) = color_prom[256+0+(i*4)]+16;
  107.         COLOR(2,idx++) = color_prom[256+1+(i*4)]+16;
  108.         COLOR(2,idx++) = color_prom[256+2+(i*4)]+16;
  109.         COLOR(2,idx++) = color_prom[256+3+(i*4)]+16;
  110.         COLOR(2,idx++) = color_prom[256+128+0+(i*4)]+16;
  111.         COLOR(2,idx++) = color_prom[256+128+1+(i*4)]+16;
  112.         COLOR(2,idx++) = color_prom[256+128+2+(i*4)]+16;
  113.         COLOR(2,idx++) = color_prom[256+128+3+(i*4)]+16;
  114.     }
  115.  
  116.     /* Patch for goalkeeper */
  117.     COLOR(2,29*8+7) = 16;
  118.  
  119. }
  120.  
  121. static void exctsccr_drawsprites( struct osd_bitmap *bitmap ) {
  122.     int offs;
  123.     unsigned char *OBJ1, *OBJ2;
  124.  
  125.     OBJ1 = videoram;
  126.     OBJ2 = &(spriteram[0x20]);
  127.  
  128.     for ( offs = 0x0e; offs >= 0; offs -= 2 ) {
  129.         int sx,sy,code,bank,flipx,flipy,color;
  130.  
  131.         sx = 256 - OBJ2[offs+1];
  132.         sy = OBJ2[offs] - 16;
  133.  
  134.         code = ( OBJ1[offs] >> 2 ) & 0x3f;
  135.         flipx = ( OBJ1[offs] ) & 0x01;
  136.         flipy = ( OBJ1[offs] ) & 0x02;
  137.         color = ( OBJ1[offs+1] ) & 0x1f;
  138.         bank = 2;
  139.         bank += ( ( OBJ1[offs+1] >> 4 ) & 1 );
  140.  
  141.         drawgfx(bitmap,Machine->gfx[bank],
  142.                 code,
  143.                 color,
  144.                 flipx, flipy,
  145.                 sx,sy,
  146.                 &Machine->drv->visible_area,
  147.                 TRANSPARENCY_PEN,0);
  148.     }
  149.  
  150.     OBJ1 = &(memory_region(REGION_CPU1)[0x8800]);
  151.     OBJ2 = spriteram;
  152.  
  153.     for ( offs = 0x0e; offs >= 0; offs -= 2 ) {
  154.         int sx,sy,code,bank,flipx,flipy,color;
  155.  
  156.         sx = 256 - OBJ2[offs+1];
  157.         sy = OBJ2[offs] - 16;
  158.  
  159.         code = ( OBJ1[offs] >> 2 ) & 0x3f;
  160.         flipx = ( OBJ1[offs] ) & 0x01;
  161.         flipy = ( OBJ1[offs] ) & 0x02;
  162.         color = ( OBJ1[offs+1] ) & 0x1f;
  163.         bank = 3;
  164.  
  165.         if ( color == 0 )
  166.             continue;
  167.  
  168.         if ( color < 0x10 )
  169.             bank++;
  170.  
  171.         if ( color > 0x10 && color < 0x17 )
  172.         {
  173.             drawgfx(bitmap,Machine->gfx[4],
  174.                 code,
  175.                 0x0e,
  176.                 flipx, flipy,
  177.                 sx,sy,
  178.                 &Machine->drv->visible_area,
  179.                 TRANSPARENCY_PEN,0);
  180.  
  181.             color += 6;
  182.         }
  183.         if ( color==0x1d && gfx_bank==1 )
  184.         {
  185.             drawgfx(bitmap,Machine->gfx[3],
  186.                 code,
  187.                 color,
  188.                 flipx, flipy,
  189.                 sx,sy,
  190.                 &Machine->drv->visible_area,
  191.                 TRANSPARENCY_PEN,0);
  192.             drawgfx(bitmap,Machine->gfx[4],
  193.                 code,
  194.                 color,
  195.                 flipx, flipy,
  196.                 sx,sy,
  197.                 &Machine->drv->visible_area,
  198.                 TRANSPARENCY_COLOR, 16);
  199.  
  200.         } else
  201.         {
  202.         drawgfx(bitmap,Machine->gfx[bank],
  203.                 code,
  204.                 color,
  205.                 flipx, flipy,
  206.                 sx,sy,
  207.                 &Machine->drv->visible_area,
  208.                 TRANSPARENCY_PEN,0);
  209.         }
  210.     }
  211. }
  212.  
  213. /***************************************************************************
  214.  
  215.   Draw the game screen in the given osd_bitmap.
  216.   Do NOT call osd_update_display() from this function, it will be called by
  217.   the main emulation engine.
  218.  
  219. ***************************************************************************/
  220. void exctsccr_vh_screenrefresh( struct osd_bitmap *bitmap, int full_refresh ) {
  221.     int offs;
  222.  
  223.     /* background chars */
  224.     for (offs = 0;offs < ( videoram_size - 0x10 );offs++) {
  225.  
  226.         if ( dirtybuffer[offs] ) {
  227.             int sx,sy,code;
  228.  
  229.             dirtybuffer[offs] = 0;
  230.  
  231.             sx = 8 * (offs % 32);
  232.             sy = 8 * (offs / 32);
  233.  
  234.             code = videoram[offs];
  235.  
  236.             drawgfx(tmpbitmap,Machine->gfx[gfx_bank],
  237.                     code,
  238.                     ( colorram[offs] ) & 0x1f,
  239.                     0, 0,
  240.                     sx,sy,
  241.                     &Machine->drv->visible_area,
  242.                     TRANSPARENCY_NONE,0);
  243.         }
  244.     }
  245.  
  246.     /* copy the character mapped graphics */
  247.     copybitmap(bitmap,tmpbitmap,0,0,0,0,&Machine->drv->visible_area,TRANSPARENCY_NONE,0);
  248.  
  249.     /* draw sprites */
  250.     exctsccr_drawsprites( bitmap );
  251.  
  252. }
  253.